<template>
  <Dialog v-model="dialogVisible" title="机房实训室课导入" width="500">
    <!-- 文件上传区域 -->
    <el-upload
      ref="uploadRef"
      v-model:file-list="fileList"
      :auto-upload="false"
      :disabled="formLoading"
      :limit="1"
      :on-change="handleFileChange"
      :on-exceed="handleExceed"
      :on-remove="handleFileRemove"
      accept=".xlsx, .xls"
      drag
    >
      <Icon icon="ep:upload" />
      <div class="el-upload__text">将文件拖到此处，或<em>点击上传</em></div>
      <template #tip>
        <div class="el-upload__tip text-center">
          <span>仅允许导入 xls、xlsx 格式文件。</span>
          <el-link
            :underline="false"
            style="font-size: 12px; vertical-align: baseline"
            type="primary"
            @click="importTemplate"
          >
            下载模板
          </el-link>
        </div>
      </template>
    </el-upload>

    <!-- 工作表选择区域 -->
    <div v-if="sheetNames.length > 0" class="mt-4">
      <el-alert
        v-if="sheetNames.length > 1"
        title="检测到多个工作表"
        type="info"
        :description="`该Excel文件包含 ${sheetNames.length} 个工作表，请选择要导入的工作表。`"
        show-icon
        :closable="false"
        class="mb-3"
      />
      <el-alert
        v-else
        title="自动选择工作表"
        type="success"
        :description="`该Excel文件只有一个工作表：${sheetNames[0]}，将自动导入此工作表。`"
        show-icon
        :closable="false"
        class="mb-3"
      />

      <el-form-item v-if="sheetNames.length > 1" label="选择工作表：">
        <el-select v-model="selectedSheetName" placeholder="请选择要导入的工作表" style="width: 100%">
          <el-option
            v-for="sheetName in sheetNames"
            :key="sheetName"
            :label="sheetName"
            :value="sheetName"
          />
        </el-select>
      </el-form-item>
    </div>

    <!-- 导入选项 -->
    <div class="mt-4">
      <el-form-item>
        <el-checkbox v-model="updateSupport" />
        是否更新已经存在的机房实训室课数据
      </el-form-item>
    </div>

    <template #footer>
      <el-button :disabled="formLoading || !canSubmit" type="primary" @click="submitForm">确 定</el-button>
      <el-button @click="dialogVisible = false">取 消</el-button>
    </template>
  </Dialog>
</template>

<script setup lang="ts">
import { LabScheduleApi } from '@/api/ao/labschedule'
import { getAccessToken, getTenantId } from '@/utils/auth'
import download from '@/utils/download'

defineOptions({ name: 'LabScheduleImportForm' })

const message = useMessage() // 消息弹窗

const dialogVisible = ref(false) // 弹窗的是否展示
const formLoading = ref(false) // 表单的加载中
const uploadRef = ref()
const fileList = ref([]) // 文件列表
const updateSupport = ref(false) // 是否更新已经存在的机房实训室课数据
const sheetNames = ref([]) // 工作表名称列表
const selectedSheetName = ref('') // 选中的工作表名称
const currentFile = ref(null) // 当前选择的文件

/** 打开弹窗 */
const open = () => {
  dialogVisible.value = true
  updateSupport.value = 0
  fileList.value = []
  sheetNames.value = []
  selectedSheetName.value = ''
  currentFile.value = null
  resetForm()
}
defineExpose({ open }) // 提供 open 方法，用于打开弹窗

/** 计算是否可以提交 */
const canSubmit = computed(() => {
  if (fileList.value.length === 0) return false
  // 如果有多个工作表但没有选择，不能提交
  if (sheetNames.value.length > 1 && !selectedSheetName.value) return false
  // 如果只有一个工作表或者已经选择了工作表，可以提交
  return true
})

/** 文件变化处理 */
const handleFileChange = async (file) => {
  if (file.raw) {
    currentFile.value = file.raw

    try {
      formLoading.value = true

      // 调用后端API获取真实的工作表名称
      const response = await LabScheduleApi.getSheetNames(file.raw)

      if (response.code === 0 && response.data && response.data.length > 0) {
        sheetNames.value = response.data

        // 如果只有一个工作表，自动选择
        if (sheetNames.value.length === 1) {
          selectedSheetName.value = sheetNames.value[0]
          message.success(`检测到工作表：${sheetNames.value[0]}`)
        } else if (sheetNames.value.length > 1) {
          selectedSheetName.value = sheetNames.value[0] // 默认选择第一个
          message.success(`检测到 ${sheetNames.value.length} 个工作表：${sheetNames.value.join(', ')}`)
        }
      } else {
        // 如果获取失败，使用默认值
        sheetNames.value = ['Sheet1']
        selectedSheetName.value = 'Sheet1'
        message.warning('无法检测工作表，将使用默认工作表Sheet1')
      }
    } catch (error) {
      console.error('获取工作表信息失败：', error)
      // 使用默认值
      sheetNames.value = ['Sheet1']
      selectedSheetName.value = 'Sheet1'
      message.warning('检测工作表失败，将使用默认工作表Sheet1')
    } finally {
      formLoading.value = false
    }
  }
}

/** 文件移除处理 */
const handleFileRemove = () => {
  sheetNames.value = []
  selectedSheetName.value = ''
  currentFile.value = null
}

/** 提交表单 */
const submitForm = async () => {
  if (!canSubmit.value) {
    message.error('请完善导入信息')
    return
  }

  try {
    formLoading.value = true
    const response = await LabScheduleApi.importLabSchedule(
      currentFile.value,
      updateSupport.value,
      selectedSheetName.value
    )

    if (response.code !== 0) {
      message.error(response.msg)
      return
    }

    // 拼接提示语
    const data = response.data
    let text = '上传成功数量：' + data.createLabScheduleCount + ';'
    text += '更新成功数量：' + data.updateLabScheduleCount + ';'
    text += '失败数量：' + data.failureLabScheduleCount + ';'
    if (data.failureLabScheduleMessages && data.failureLabScheduleMessages.length > 0) {
      text += '失败数据：' + data.failureLabScheduleMessages.join(', ')
    }
    message.alert(text)
    dialogVisible.value = false
    // 发送操作成功的事件
    emits('success')
  } catch (error) {
    message.error('导入失败：' + error.message)
  } finally {
    formLoading.value = false
  }
}

/** 文件上传成功 */
const emits = defineEmits(['success'])

/** 重置表单 */
const resetForm = async (): Promise<void> => {
  // 重置上传状态和文件
  formLoading.value = false
  await nextTick()
  uploadRef.value?.clearFiles()
}

/** 文件数超出提示 */
const handleExceed = (): void => {
  message.error('最多只能上传一个文件！')
}

/** 下载模板操作 */
const importTemplate = async () => {
  const res = await LabScheduleApi.importLabScheduleTemplate()
  download.excel(res, '机房实训室课导入模版.xls')
}
</script>
